<?php
class MovComponent extends Object{
	
	var $instances = array();
	var $components = array('Auth', 'Session');
	var $data_ini;
	var $data_fim;
	var $produtos;
	var $movimentos;
	
	
	
	function __construct(){
		$this->instances['produto'] = ClassRegistry::init('Produto');
		$this->instances['movimento'] = ClassRegistry::init('Movimento');
		$this->setData(date('m'), date('Y'));
	}
	
	/* FUNÇÕES COM DATA */
	
	function setData($mes, $ano){
		$this->data_fim = "$ano-$mes-31";
		$this->data_ini = "$ano-$mes-01";
	}
	
	function mesAnterior(){
		$data = explode('-', $this->data_fim);
//		echo 'Data => '.date('Y-m-d', strtotime('-1 month', mktime(0 , 0, 0, $data[1], $data[2], $data[0]))).'<br>';
		return date('Y-m-d', strtotime('-1 month', mktime(0 , 0, 0, $data[1], $data[2], $data[0])));
	}
	
	
	/* PREENCHIMENTO DE PRODUTOS E MOVIMENTOS */
	
	function getProdutos($idCategoria = null){
		if($this->Session->read('Auth.User.tipo_usuario') !== 'A')
			$this->produtos = $this->instances['produto']->find('all', array('conditions'=>array('Produto.user_id'=>$this->Session->read('Auth.User.id_user')),
																		  'order'=>'descricao ASC'));
		else 
			if($idCategoria == null)
				$this->produtos = $this->instances['produto']->find('all', array('order'=>'descricao ASC'));
			else
				$this->produtos = $this->instances['produto']->find('all', array('conditions'=>array('Produto.tipo_id'=>$idCategoria),'order'=>'descricao ASC'));
		return ($this->produtos);
	}
	
	function verificaSaidaEstoque($quantidade, $idProduto){
		$numProdutosEstoque = $this->getTotalProdutoEstoque($idProduto);
		if($quantidade > $numProdutosEstoque)
			return false;
		else return true;
	}

	
	function getTotalProdutoEstoque($idProduto){
		$dados = $this->instances['movimento']->find('all', array(
										'fields'=>'SUM(Movimento.quantidade)',
										'conditions'=>array(
											'Movimento.produto_id'=>$idProduto,
											'date_historico <=' =>$this->data_fim)));
		return $dados[0][0]['SUM(`Movimento`.`quantidade`)']+=0;
	}
	
	function getTotalAnterior($idProduto){
		$dados = $this->instances['movimento']->find('all', array(
										'fields'=>'SUM(Movimento.quantidade) as totalAnterior',
										'conditions'=>array(
											'Movimento.produto_id'=>$idProduto,
											'date_historico <' =>$this->data_ini)));
		
		return $dados[0][0]['totalAnterior']+=0;
	}
	
	
	function getTotalMensal($idProduto){
		$entradas = $this->instances['movimento']->find('all', array(
										'fields'=>'SUM(Movimento.quantidade) as totalEntradaMensal',
										'conditions'=>array(
											'Movimento.produto_id'=>$idProduto,
											'date_historico >=' =>$this->data_ini,
											'date_historico <=' =>$this->data_fim,
											'quantidade >'=> 0)));
		$saidas = $this->instances['movimento']->find('all', array(
										'fields'=>'SUM(Movimento.quantidade) as totalSaidaMensal',
										'conditions'=>array(
											'Movimento.produto_id'=>$idProduto,
											'date_historico >=' =>$this->data_ini,
											'date_historico <=' =>$this->data_fim,
											'quantidade <'=> 0)));
		return array('entrada' =>$entradas[0][0]['totalEntradaMensal']*=1,
						'saida'=>$saidas[0][0]['totalSaidaMensal']*=-1,
						'total'=>$entradas[0][0]['totalEntradaMensal']-$saidas[0][0]['totalSaidaMensal']);
	}

	function converteData($data){
		$array = explode('-', $data);
		return array('day' => $array[2], 'month' => $array[1], 'year' => $array[0]);
	}
	
	function getValores($idProduto, $data = null){
		
		$dados = $this->instances['movimento']->find('all', array(
										'fields'=>'Movimento.money_valor_unit as valor_unitario, Movimento.quantidade as quantidade, Movimento.quantidade_externa, Movimento.money_IPI_produto as IPI',
										'order'=>'date_historico ASC',
										'conditions'=>array(
											'Movimento.produto_id'=>$idProduto,
											'date_historico <=' =>$this->data_fim)));
		
		$totalProdutos = 0;
		$totalValor = 0;
		foreach ($dados as $item){
			if($item['Movimento']['quantidade'] > 0){
				$valorUnitario = (($item['Movimento']['valor_unitario']*$item['Movimento']['quantidade_externa'])+$item['Movimento']['IPI'])/$item['Movimento']['quantidade'];
			}
			else{ // Calcula saída do produto
					if($totalProdutos > 0) $valorUnitario = $totalValor/$totalProdutos; else $valorUnitario = 0;
			}
		$totalProdutos += $item['Movimento']['quantidade'];
		$totalValor += $valorUnitario*$item['Movimento']['quantidade'];
		}
		if($idProduto == 19) pr($totalProdutos);
		if($totalProdutos > 0){
			if($idProduto == 19) pr($totalValor);
			return array('valor_unitario'=>$totalValor/$totalProdutos, 'valor_total'=>$totalValor);
		}
		elseif($totalProdutos == 0){
			$dados = $this->instances['movimento']->find('all', array(
					'fields'=>'Movimento.money_valor_unit as valor_unitario, Movimento.quantidade as quantidade, Movimento.quantidade_externa, Movimento.money_IPI_produto as IPI',
					'conditions'=>array(
							'Movimento.produto_id'=>$idProduto,
							'date_historico <=' =>$this->data_ini)));
			$totalValor = 0;
			foreach ($dados as $item){
				if($item['Movimento']['quantidade'] > 0){
					$valorUnitario = (($item['Movimento']['valor_unitario']*$item['Movimento']['quantidade_externa'])+$item['Movimento']['IPI'])/$item['Movimento']['quantidade'];
				}
				else{ // Calcula saída do produto
					$valorUnitario = $totalValor/$totalProdutos;
				}
				$totalProdutos += $item['Movimento']['quantidade'];
				$totalValor += $valorUnitario*$item['Movimento']['quantidade'];
			}
			$mensais = $this->getTotalMensal($idProduto);
			if($mensais['entrada'] == $mensais['saida']){ // Zerou, precisa calcular especial
				$dados = $this->instances['movimento']->find('all', array('conditions'=>array('produto_id'=>$idProduto, 'date_historico >='=>$this->data_ini, 'date_historico <='=>$this->data_fim, 'quantidade >'=>0), 'recursive'=>-1));
				$sum_quantidade = $sum_valor = 0;
				foreach($dados as $item){
					$sum_quantidade += $item['Movimento']['quantidade'];
					$sum_valor += $item['Movimento']['money_valor_unit'];
				}
				return array('valor_unitario'=>$sum_valor/$sum_quantidade, 'valor_total'=>$sum_valor);
			}
			else // Não zerou... calcula normal
				return array('valor_unitario'=>$totalValor/$mensais['saida'], 'valor_total'=>$totalValor);
		}
		else return 0;
	}
	
	
	function calculaDinheiroProduto($idProduto){
		// $produtos = $this->get
	}
	
	function getProdutosPorNota($id){
		return $this->instances['movimento']->find('all', array('conditions'=>array('nota_fiscal_id'=>$id)));
	}
	
	function atualizarData($nota){
		$data = $nota['NotaFiscai']['date_data'];
		$this->instances['movimento']->updateAll(array('date_historico' => "'".$data['year'].'-'.$data['month'].'-'.$data['day']."'"), array('nota_fiscal_id'=>$nota['NotaFiscai']['id_nota_fiscal']));
	}
}
?>